package com.lmf.rabbitmq.eight;

import com.lmf.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * 死信的三大来源： 1.消息被拒绝     2.消息过期       3.正常队列长度达到最长，多出的消息会被转发到死信队列
 *
 * 模拟实现死信队列：（消费者01）
 *          consumer 从 queue 取出消息 进行消费，但某些时候由于特定的原因导致 queue 中的某些消息无法被消费，
 *          这样的消息如果没有后续的处理，就变成了死信，有死信自然就有了死信队列。死信队列可以再通过其他消费者接收
 *
 */
public class Consumer02 {

    //定义死信队列名称
    private static final String DEAD_NAME = "dead_name";

    public static void main(String[] args) throws IOException, TimeoutException {

        Channel channel = RabbitMqUtils.getChannel();

        //消息接收成功，回调函数
        DeliverCallback deliverCallback = new DeliverCallback() {
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
                //打印
                String str = new String(message.getBody());
                System.out.println("死信队列接收成功的消息：标识为：" + consumerTag + "； 信息内容为：" + str);
            }
        };
        //接收普通队列消息
        System.out.println("c2死信队列等待接收消息........... ");
        channel.basicConsume(DEAD_NAME,true,deliverCallback,consumerTag -> {});
    }

}
